package MAIN;
//笔试强训第14天
//选择题
/*外键就是用来关联别的有关系的表的，范式是符合某一种级别的关系模式的集合，关系数据库的关系必须满足
一定的要求，满足不同程度的要求的为不同范式。  第一范式：列不可再分， 第二范式：属性完全依赖于主键，
主键可以是一个字段，也可以是很多的字段构成的一个主键，也就是每一行的数据只能做一件事，每一行的数据只能与其中一列
有关，第三范式：属性直接依赖于主键，比如一张学生表（学号，姓名，年龄，所在院校，院校地址），此时根据学号就可以确定
所在院校，根据所在院校就可以确定院校的地址，也就是数据之间不能存在传递关系，对于这种表结构我们需要拆分成两张表然后用
一个外键来关联这两张表，比如所在院校，  BCNF范式：就是第三范式的修正版，不能只依赖于一个主键创建其他的候选键，比如
用学号和所在院校一起作为主键，此时是符合主键，在创建其他的向姓名年龄这样的候选键，此时不能只依赖学号/所在院校中的一个
来创建候选键*/
/*数据库系统的特点：数据共享性高，冗余度小，具有高度的物理独立性和逻辑独立性，整体结构化，用数据模型描述
* 由数据库系统提供数据安全性，完整性，并发控制和恢复能力，
* 高共享（通过主外键达到共享的目的），低冗余，独立性高，具有完整性
* 逻辑上也具有一定的关联性（用外键关联两个表）*/
/*将E-R图转换为关系模型时，实体之间实现多对多的实现方式是建立新的关系（多对多需要一个建立中间表）*/
/*数据库中的求和函数：sum（），count（），avg（）都不属于求和函数*/
/*自然连接：R和S具有相同的属性组B，然后R和s进行笛卡尔积后选出选出同名属性条件的元组，
* 然后进行重复值的过滤*/
/*交和并的前提是两个结果集中必须有相同的字段*/
/*除：1.找第二个表中的重复字段，2.找第一个表中第二个表没有的字段，3.根据第二步再看第一个表剩下的字段*/
/*关系型数据库采用的数据存储方式是二维表*/
/*alter：管理表结构的关键字*/

//编程题
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main14 {
    //计算日期到天数转换（这个题是按照非闰月进行输出）
    public static void main1(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNextInt()) {
            int y = scan.nextInt();
            int m = scan.nextInt();
            int d = scan.nextInt();
            //把合计的天数放到一个数组中
            int[] day = {31,59,90,120,151,181,212,243,273,304,334,365};
            int sum = 0;
            if (m >= 2) {
                sum += day[m-2];
            }
            sum += d;
            //判断是否为闰年
            if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
                sum += 1;
            }
            System.out.println(sum);
        }
    }
    //幸运的袋子:球的号码的和要求大于号码的积
    /*1.将袋子中的球的号码数字排序， 2.当一个号码和前面的号码无法组成幸运的袋子，那就直接break，
    * 因为后面的号码一定是比前面的号码数字大或者是等于，也无法构成幸运的袋子， 3.当返回上层递归的
    * 时候，需要进行回溯，继续计算前面的号码和当前号码的后一个位置的号码是否可以构成幸运的袋子*/
    /*特殊的情况：1和任何数的和都要大于1和任何数的积*/
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = scan.nextInt();
        }
        Arrays.sort(arr);
        System.out.println(count(arr,n,0,0,1));
    }
    public static int count(int[] arr,int n,int pos,int sum,int multi) {
        int count = 0;
        for (int i = pos; i < n; i++) {
            sum += arr[i];
            multi *= arr[i];
            if (sum > multi) {
                count = count + 1 + count(arr,n,i+1,sum,multi);
            }else if (arr[i] == 1) {
                count = count + count(arr,n,i+1,sum,multi);
            }else {
                break;
            }
            //进行回溯
            sum -= arr[i];
            multi /= arr[i];
            //当i和i+1位置的球的号码相同的时候，此时就略过，相同的号码组成幸运袋子只能计数为1个
            while (i < n-1 && arr[i] == arr[i+1]) {
                i++;
            }
        }
        return count;
    }
}
